/**
 * 后台API子系统入口文件
 */
const express = require("express");

/*1.创建应用服务器，并监听指定端口*/
let port = 5050;
let app = express();
app.listen(port, () => {
  console.log("Server listening on port: ", port);
});

/*2.使用前置中间件*/
//请求主体解析中间件
const bodyParser = require("body-parser");
//app.use(bodyParser.urlencoded({}))
app.use(bodyParser.json({})); //把请求主体中的application/json数据解析到req.body
//允许客户端跨域请求中间件
const cors = require("cors");
app.use(
  cors({
    // origin: '*'  //客户端携带了身份认证信息的话，Access-Control-Allow-Origin不允许是*
    origin: ["http://127.0.0.1:8080", "http://localhost:8080"],
    //响应消息必需明确允许客户端携带身份认证信息，Access-Control-Allow-Credentials:true
    credentials: true,
  })
);
//session处理中间件
const session = require("express-session");
app.use(
  session({
    secret: "xiaomi123", //秘密/秘钥/加密种子，用于生成随机的客户端无法预测的sessionID
    saveUninitialized: true, //自动保存未经手工存储过的会话数据吗？
    resave: true, //当会话数据被修改后，需要自动重新保存吗？
  })
);
//上传文件处理中间件

/*3.声明路由器/路由：路由 = 请求消息(方法/URL/数据) + 处理方法 + 响应消息*/
//用户相关的路由器
const userRouter = require("./router/user");
app.use("/user", userRouter);
//商品相关的路由
const productRouter = require("./router/product");
app.use("/product", productRouter);
//验证码相关的路由器
const captchaRouter = require("./router/captcha");
app.use("/captcha", captchaRouter);
//购物车相关的路由
const cartRouter = require("./router/cart");
app.use("/cart", cartRouter);

/*4.声明后置中间件*/
//此处必须有后置的异常处理中间件！！否则一旦路由抛异常，整个服务器会崩溃，客户端会收到5xx错误
/*
Express默认提供了一个如下的错误处理中间件
app.use((err, req, res, next)=>{
	//1 在服务器的控制台（如果有的话）中输出错误消息
	//2 向客户端输出一个500的响应消息，Content-Type：text/html
})
*/
//自定义一个错误处理中间件
app.use((err, req, res, next) => {
  res.status(500);
  let output = {
    code: 500,
    msg: "Server Interval Error",
    err: err,
  };
  res.json(output);
  //TODO: 此处也可以在一个log文件中记录此次错误
});
